Reliability is of key importance to success of any software in the market. Users are easily deterred by a faulty software program. Thus, software developers expend significant amount resources to ensure their software is reliable. However, continued pressure on software developers to shorten software development cycles has placed on them an increased demand for making the process of software testing and verification more accurate and less time consuming. Furthermore, costs related to testing and verification has grown to represent a significant portion (50% by some estimates) of the overall cost of developing a piece of software. Thus, automation tools for testing and verification have grown to be more and more sophisticated over time.
One aspect of testing and verification of software (regardless of the type of automation) that is particularly challenging is the ability of a testing tool to define a finite domain of data to be used in the testing. For instance, if a program accepts as one of its data inputs the basic data type of Integer that would mean that for a testing tool to exhaustively test the software it would have to conduct the test by applying virtually an infinite number of different integers. However, that is not only costly and time consuming but it also may be meaningless. Thus, a tester may look to the data members or variables of a program such as its various fields or parameters of the type Integer and manually limit the domain of each such data member to a selected set of values. For instance, if Age is a field of the type Integer then a meaningful domain for such a data member may be limited to integers ranging from 1-100. Such finitization is applicable to virtually any type of data. Thus, the process of testing can be vastly improved by specifying, or configuring the domain of the various data structure elements related to software programs.
However, manually identifying the various elements of a program and the data types they use and manually configuring their domains can be time consuming, if not impossible. Thus, there is a need to automate the process of identifying the various data structure elements of a program and configuring their domains to generate a meaningful set of data for testing and verification.
Furthermore, programs generally don't use data devoid of any context or relationship to other data. For example, most programming languages allow for defining data types and these data type definitions may be further used in defining particular data members such as data fields, and parameters of a program. For instance, if Age is defined in a program as a data of the type integer and Weight is also defined as the data type of Integer then Age and Weight are related through the fact that they are of the same type (Integer). Such relationships may be relied on to configure the domain of the data fields such as Age and Weight. For instance, the configuration of the domain for both Age and Weight may be the result of configuring the domain of their type the Integer. However, in a program of any meaningful size there may be literally thousands, if not more, such relationships and these relationships may also be more complex than the simple example provided above. To keep abreast of such relationships when manually configuring the domains may be nearly impossible. Thus, there is a need for methods and systems that automate the process of configuring data domains of a program by relying on the relationships between the various data.